\documentclass[C:/Users/12748/Desktop/latex模板/main/main.tex]{subfiles}
\begin{document}

\textbf{使用：}

\begin{itemize}
\item
  头文件：\texttt{\#include\textless{}ext/rope\textgreater{}}
\item
  命名空间：\texttt{using\ namespace\ \_\_gnu\_cxx;}
\item
  定义方法：

  \begin{itemize}
  \item
    \(rope\)\textless 变量类型\textgreater 变量名称
  \item
    \(crope\) 变量名称（相当于定义成 \(rope<char>\)，即定义为 \(string\)
    类型）
  \end{itemize}
\end{itemize}

\textbf{定义为 \(string\) ：}

\begin{itemize}
\item
  \texttt{insert(int\ pos,\ char\ *s,\ int\ n)} ~\\
  将字符串 \(s\) 的前 \(n\) 位插入 \(rope\) 的下标 \(pos\)
  处，如没有参数 \(n\) 则将字符串 \(s\) 的所有位都插入 \(rope\) 的下标
  \(pos\) 处
  （补充地址知识：如果你不想从字符串下标为0（即第一个字符）的地址开始取n位，就将你想开始取的地址代入。如
  \(s+1\) 表示从字符串下标为 \(1\)（即第二个字符）的地址开始取 \(n\)
  位。\(int、char\)等变量类型的数组都适用这种方法来更改数组操作的起始位置。）
\item
  \texttt{append(char\ *s\ ,\ int\ pos\ ,\ int\ n)}~\\
  把字符串 \(s\) 中从下标 \(pos\) 开始的 \(n\) 个字符连接到 \(rope\)
  的结尾，如没有参数 \(n\) 则把字符串 \(s\) 中下标 \(pos\)
  后的所有字符连接到 \(rope\) 的结尾，如没有参数 \(pos\) 则把整个字符串
  \(s\) 连接到 \(rope\) 的结尾（这里已经给你起始位置参数 \(pos\)
  了就没必要用上述的取地址方法了哈）
\item
  \(insert\) 和 \(append\) 的区别：\(insert\) 能把字符串插入到 \(rope\)
  中间，但 \(append\) 只能把字符串接到结尾）
\item
  \texttt{substr(int\ pos\ ,\ int\ len)} ~\\
  提取 \(rope\) 的从下标 \(pos\) 开始的 \(len\) 个字符
\item
  \texttt{at(int\ x)} 访问 \(rope\) 的下标为 \(x\) 的元素
\item
  \texttt{erase(int\ pos\ ,\ int\ num)} 从 \(rope\) 的下标 \(pos\)
  开始删除 \(num\) 个字符
\item
  \texttt{copy(int\ pos\ ,\ \ int\ len\ ,\ \ string\ \&s)} 从 \(rope\)
  的下标 \(pos\) 开始的 \(len\) 个字符用字符串 \(s\) 代替，如果 \(pos\)
  后的位数不够就补足
\item
  \texttt{replace(int\ pos\ ,\ \ string\ \&x)} ~\\
  从 \(rope\) 的下标 \(pos\) 开始替换成字符串 \(x\)，\(x\) 的长度为从
  \(pos\) 开始替换的位数，如果 \(pos\) 后的位数不够就补足
\end{itemize}

\textbf{定义为 \(int\)}

\begin{itemize}
\item
  \texttt{insert(int\ pos\ ,\ int\ *a\ ,\ int\ n)} ~\\
  将 \(int\) 数组 \(a\) 的前 \(n\) 位插入 \(rope\) 的下标 \(pos\)
  处，如没有参数 \(n\) 则将数组s的所有位都插入 \(rope\) 的下标 \(pos\)
  处
\item
  \texttt{append(int\ *a\ ,\ int\ pos\ ,\ int\ n)}~\\
  把数组 \(a\) 中从下标 \(pos\) 开始的 \(n\) 个数连接到 \(rope\)
  的结尾，如没有参数 \(n\) 则把数组 \(a\) 中下标 \(pos\)
  后的所有数连接到 \(rope\) 的结尾，如没有参数 \(pos\) 则把整个数组
  \(a\) 连接到 \(rope\) 的结尾
\item
  \texttt{substr(int\ pos\ ,\ int\ len)} 提取 \(rope\) 的从下标 \(pos\)
  开始的 \(len\) 个数
\item
  \texttt{at(int\ x)} 访问 \(rope\) 的下标为 \(x\) 的元素
\item
  \texttt{erase(int\ pos\ ,\ int\ num)} 从 \(rope\) 的下标 \(pos\)
  开始删除 \(num\) 个数
\item
  \texttt{copy(int\ pos\ ,\ int\ len\ ,\ int\ *a)} ~\\
  从 \(rope\) 的下标 \(pos\) 开始的 \(len\) 个数用数组 \(a\) 代替，如果
  \(pos\) 后的位数不够就补足
\item
  \texttt{replace(int\ pos\ ,\ int\ *a)} ~\\
  从 \(rope\) 的下标 \(pos\) 开始替换成数组 \(a\)，\(a\) 的长度为从
  \(pos\) 开始替换的位数，如果 \(pos\) 后的位数不够就补足
\item
  时间复杂度：\(O(n\sqrt{n}）\)，具体原理详见块状链表
\end{itemize}

\textbf{可持久化：}

\begin{verbatim}
rope<int>*rs[N + 10];
rs[0]=new rope<int>();
rs[0]->append(0);
rs[i] = new rope<int>(*rs[v]);
rs[i] -> replace(a , b);
rs[i] -> at(a));
\end{verbatim}

\end{document}
